#include "Ielement.hpp"

IElement::IElement(IElement* parent, SDL_Surface* surf) :
  childs_()
  ,position_()
  ,size_()
  ,parent_(parent)
  ,surface_(surf)
  ,pressed_(false)
{
	SetPosition(0, 0);
	SetSize(20, 20);

}

IElement::~IElement()
{

}


void IElement::Update()
{
  this->update();
  for(std::vector<IElementP>::iterator i = childs_.begin();
      i != childs_.end();
      i++)
    {
      (*i)->Update();
    }
}

void IElement::Render(Vec<int,2>& pos)
{
  this->render(pos.Get(0), pos.Get(1));
  Vec<int,2> cpos = pos + position_;
  for(std::vector<IElementP>::iterator i = childs_.begin();
      i != childs_.end();
      i++)
    {
      (*i)->Render(cpos);
    }
}

void IElement::AddChild(IElement* ch)
{
  childs_.push_back(ch);
  
}

void IElement::SetPosition(int x, int y)
{
	position_.Set(0,x);
	position_.Set(1,y);
	onMove();
}

void IElement::SetSize(int x, int y)
{
	size_.Set(0,x);
	size_.Set(1,y);
	onResize();
}

bool IElement::MouseUp(int x, int y, Uint8 button)
{
	Vec<int,2> cpos;
	cpos.Set(0,x);
	cpos.Set(1,y);
	if(cpos.isInRect(position_,size_) == true)
	{
		pressed_=false;
		this->mouseUp(x,y,button);
		for(std::vector<IElementP>::iterator i = childs_.begin();
				i != childs_.end();
				i++)
		{
			(*i)->MouseUp(x,y,button);
		}
		return true;
	}	
	return false;
}

bool IElement::MouseDown(int x, int y, Uint8 button)
{
	Vec<int,2> cpos;
	cpos.Set(0,x);
	cpos.Set(1,y);
	if(cpos.isInRect(position_,size_) == true)
	{
		pressed_=true;
		this->mouseDown(x,y,button);
		for(std::vector<IElementP>::iterator i = childs_.begin();
				i != childs_.end();
				i++)
		{
			(*i)->MouseDown(x,y,button);
		}
		return true;
	}	
	return false;
}

bool IElement::MouseMove(int x, int y, Uint8 button)
{
	Vec<int,2> cpos;
	cpos.Set(0,x);
	cpos.Set(1,y);
	if(cpos.isInRect(position_,size_) == true)
	{
		this->mouseMove(x,y,button);
		for(std::vector<IElementP>::iterator i = childs_.begin();
				i != childs_.end();
				i++)
		{
			(*i)->MouseMove(x,y,button);
		}
		return true;
	}else if(pressed_==true)
	{
		pressed_=false;
	}
	return false;
}

bool IElement::KeyDown(Uint8 key)
{
	this->keyDown(key);
		for(std::vector<IElementP>::iterator i = childs_.begin();
				i != childs_.end();
				i++)
		{
			(*i)->KeyDown(key);
		}
		return true;
}

bool IElement::mouseUp(int x, int y, Uint8 button)
{
	return false;
}
bool IElement::mouseDown(int x, int y, Uint8 button)
{
	return false;
}
bool IElement::mouseMove(int x, int y, Uint8 button)
{
	return false;
}
bool IElement::keyDown(Uint8 key)
{
	return false;
}
void IElement::onResize()
{
	return;
}
void IElement::onMove()
{
	return;
}